package com.zhangshanfeng;

import java.util.ArrayList;
/*
### 1.5类型通配符

- 类型通配符: **<?>  ？代表可以接收任意类型**

  - ArrayList<?>: 表示元素类型未知的ArrayList,它的元素可以匹配任何的类型
  - 但是并不能把元素添加到ArrayList中了,获取出来的也是父类类型

- 类型通配符上限: **<? extends 类型>  只能接收该类型及其子类**

  - ArrayListList <? extends Number>: 它表示的类型是Number或者其子类型

- 类型通配符下限: **<? super 类型>  只能接收该类型及其父类型**

  - ArrayListList <? super Number>: 它表示的类型是Number或者其父类型

- 泛型通配符的使用
 */
public class GenericDemo04 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        ArrayList<Number> list1 = new ArrayList<>();
        ArrayList<Object> list2 = new ArrayList<>();
        ArrayList<String> list3 = new ArrayList<>();

        method(list);
        method(list1);
        method(list2);
        method(list3);

        /*getElement(list);
        getElement(list1);
        getElement(list2);//报错--只能是Number本身和他的的子类Integer
        getElement(list3);//报错--*/



       /* getElement2(list);//报错--只能是Number本身和他的父类Object
        getElement2(list1);
        getElement2(list2);
        getElement2(list3);//报错*/





    }

    //ArrayList<?>: 表示元素类型未知的ArrayList,它的元素可以匹配任何的类型
    //  - 但是并不能把元素添加到ArrayList中了,获取出来的也是父类类型
    public static void method(ArrayList<?> list){}
//类型通配符上限: **<? extends 类型>  只能接收该类型及其子类**
    public static void getElement(ArrayList<? extends Number> list){}
//类型通配符下限: **<? super 类型>  只能接收该类型及其父类型**
    public static void getElement2(ArrayList<? super Number> list){}

}
